package Clases;

import java.util.ArrayList;
import java.util.Iterator;

import frsf.cidisi.exercise.arqueologo.search.ArqueologoPerception;

public class Mundo {

    private int[][] distancias = {{0, 100, -1, -1, -1, -1, 150, -1, -1, -1, -1},
    {100, 0, 180, -1, 200, -1, -1, -1, -1, -1, -1},
    {-1, 180, 0, 450, -1, -1, -1, -1, -1, -1, -1},
    {-1, -1, 450, 0, -1, 100, 400, 200, 300, -1, -1},
    {-1, 200, -1, -1, 0, 350, -1, -1, -1, -1, -1},
    {-1, -1, -1, 100, 350, 0, -1, -1, -1, -1, -1},
    {150, -1, -1, 400, -1, -1, 0, -1, -1, -1, -1},
    {-1, -1, -1, 200, -1, -1, -1, 0, -1, -1, -1},
    {-1, -1, -1, 300, -1, -1, -1, -1, 0, 200, -1},
    {-1, -1, -1, -1, -1, -1, -1, -1, 200, 0, 200},
    {-1, -1, -1, -1, -1, -1, -1, -1, -1, 200, 0}};
    private ArrayList<Aldea> aldeas;
    private int tesoroRemanente;

    public Mundo() {
        super();
        this.aldeas = new ArrayList<Aldea>();
        this.setAldeas();
        this.setDistancias(distancias);
    }

    @Override
    public Object clone() {
        Mundo m = new Mundo();
        ArrayList<Aldea> a = new ArrayList<Aldea>();
        for (Aldea aldea : aldeas) {
            a.add((Aldea) aldea.clone());
        }
        m.setDistancias(distancias);
        m.aldeas = a;
        return m;
    }

    public int[][] getDistancias() {
        return distancias;
    }

    public void setDistancias(int[][] distancias) {
        this.distancias = distancias;
    }

    public void setAldeas() {
        Aldea a1 = new Aldea();
        Aldea a2 = new Aldea();
        Aldea a3 = new Aldea();
        Aldea a4 = new Aldea();
        Aldea a5 = new Aldea();
        Aldea a6 = new Aldea();
        Aldea a7 = new Aldea();
        Aldea a8 = new Aldea();
        Aldea a9 = new Aldea();
        Aldea a10 = new Aldea();
        Aldea a11 = new Aldea();
        Cofre c1 = new Cofre();
        Cofre c2 = new Cofre();
        Cofre c3 = new Cofre();
        Cofre c4 = new Cofre();
        Cofre c5 = new Cofre();
        Cofre c6 = new Cofre();
        Cofre c7 = new Cofre();
        Cofre c8 = new Cofre();
        Cofre c9 = new Cofre();
        Cofre c10 = new Cofre();
        Cofre c11 = new Cofre();

        //Situacion 1...
        int[] cant = new int[]{100, 20, 80, 300, 550};
        //Situacion 2...
//		int[] cant = new int[]{500,200,150,500,400};
        c1.setCantidad(cant);
        a1.setNombre(Aldea.ARAGAEY);
        a1.setCofre(c1);
        c1.actualizarCofre();
        a1.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a1);

        //Situacion 1...
        cant = new int[]{300, 400, 280, 80, 150};
        //Situacion 2...
//		cant = new int[]{300,400,50,100,80};
        c3.setCantidad(cant);
        a3.setNombre(Aldea.ERGINTONE);
        a3.setCofre(c3);
        c3.actualizarCofre();
        a3.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a3);

        //Situacion 1...
        cant = new int[]{100, 400, 500, 450, 500};
        //Situacion 2...
//		cant = new int[]{200,150,200,300,400};
        c2.setCantidad(cant);
        a2.setNombre(Aldea.PEREGAEY);
        a2.setCofre(c2);
        c2.actualizarCofre();
        a2.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a2);

        //Situacion 1...
        cant = new int[]{50, 150, 200, 50, 150};
        //Situacion 2...
//		cant = new int[]{500,200,150,300,250};
        c4.setCantidad(cant);
        a4.setNombre(Aldea.VINIZAILE);
        a4.setCofre(c4);
        c4.actualizarCofre();
        a4.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a4);

        //Situacion 1...
        cant = new int[]{250, 120, 20, 150, 300};
        //Situacion 2...
//		cant = new int[]{150,350,100,100,250};
        c5.setCantidad(cant);
        a5.setNombre(Aldea.BULOVOE);
        a5.setCofre(c5);
        c5.actualizarCofre();
        a5.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a5);

        //Situacion 1...
        cant = new int[]{400, 200, 300, 400, 250};
        //Situacion 2...
//		cant = new int[]{50,150,300,80,150};
        c6.setCantidad(cant);
        a6.setNombre(Aldea.ICAEDUR);
        a6.setCofre(c6);
        c6.actualizarCofre();
        a6.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a6);

        //Situacion 1...
        cant = new int[]{80, 80, 70, 20, 200};
        //Situacion 2...
//		cant = new int[]{400,500,250,300,550};
        c7.setCantidad(cant);
        a7.setNombre(Aldea.BRESOL);
        a7.setCofre(c7);
        c7.actualizarCofre();
        a7.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a7);

        //Situacion 1...
        cant = new int[]{160, 250, 170, 60, 120};
        //Situacion 2...
//		cant = new int[]{250,150,350,400,350};
        c8.setCantidad(cant);
        a8.setNombre(Aldea.CABE);
        a8.setCofre(c8);
        c8.actualizarCofre();
        a8.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a8);

        //Situacion 1...
        cant = new int[]{350, 350, 240, 150, 350};
        //Situacion 2...
//		cant = new int[]{50,400,300,500,250};
        c9.setCantidad(cant);
        a9.setNombre(Aldea.MIXOCU);
        a9.setCofre(c9);
        c9.actualizarCofre();
        a9.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a9);

        //Situacion 1...
        cant = new int[]{20, 50, 70, 100, 60};
        //Situacion 2...
//		cant = new int[]{300,400,500,200,150};
        c10.setCantidad(cant);
        a10.setNombre(Aldea.ASE);
        a10.setCofre(c10);
        c10.actualizarCofre();
        a10.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a10);

        //Situacion 1...
        cant = new int[]{220, 300, 130, 400, 280};
        //Situacion 2...
//		cant = new int[]{100,300,400,400,400};
        c11.setCantidad(cant);
        a11.setNombre(Aldea.CENEDE);
        a11.setCofre(c11);
        c11.actualizarCofre();
        a11.setPercepcion(ArqueologoPerception.COFRE_LLENO);
        aldeas.add(a11);

        this.tesoroRemanente = this.calcularTesoroTotal();
    }

    public ArrayList<String> getNombres() {
        ArrayList<String> nombres = new ArrayList<String>();
        Iterator<Aldea> it = aldeas.iterator();
        while (it.hasNext()) {
            nombres.add(it.next().getNombre());
        }
        return nombres;
    }

    public Cofre getCofre(String aldea) {
        Cofre co = new Cofre();
        int i = 0;

        while (i < 11 && aldeas.get(i).getNombre() != aldea) {
            i++;
        }
        co = aldeas.get(i).getCofre();
        return co;
    }

    public Aldea getAldea(String nombre) {
        int i = 0;

        while (i < 11 && aldeas.get(i).getNombre() != nombre) {
            i++;
        }

        return aldeas.get(i);
    }

    public int[][] distanciasMinimas() {
        int[][] distMin = {{0, 100, -1, -1, -1, -1, 150, -1, -1, -1, -1},
        {100, 0, 180, -1, 200, -1, -1, -1, -1, -1, -1},
        {-1, 180, 0, 450, -1, -1, -1, -1, -1, -1, -1},
        {-1, -1, 450, 0, -1, 100, 400, 200, 300, -1, -1},
        {-1, 200, -1, -1, 0, 350, -1, -1, -1, -1, -1},
        {-1, -1, -1, 100, 350, 0, -1, -1, -1, -1, -1},
        {150, -1, -1, 400, -1, -1, 0, -1, -1, -1, -1},
        {-1, -1, -1, 200, -1, -1, -1, 0, -1, -1, -1},
        {-1, -1, -1, 300, -1, -1, -1, -1, 0, 200, -1},
        {-1, -1, -1, -1, -1, -1, -1, -1, 200, 0, 200},
        {-1, -1, -1, -1, -1, -1, -1, -1, -1, 200, 0}};

        for (int i = 0; i < 11; i++) {
            for (int j = 0; j < 11; j++) {
                for (int k = 0; k < 11; k++) {
                    if ((distMin[j][i] > -1) && (distMin[i][k] > -1)) {
                        if (distMin[j][k] > -1) {
                            distMin[j][k] = Math.min(distMin[j][k], distMin[j][i] + distMin[i][k]);
                        } else {
                            distMin[j][k] = distMin[j][i] + distMin[i][k];
                        }
                    }
                }
            }
        }
        return distMin;
    }

    private int calcularTesoroTotal() {
        int teTotal = 0;

        for (int i = 0; i < 11; i++) {
            teTotal += this.getCofre(this.aldeas.get(i).getNombre()).getValor();
        }

        return teTotal;
    }

    public int getTesoroRemanente() {
        return this.tesoroRemanente;
    }

    public void restarTesoro(String al) {
        this.tesoroRemanente -= this.getCofre(al).getValor();
    }
}
